/* 
 * File:   main.cpp
 * Author: hector
 *
 * Created on December 5, 2009, 4:51 PM
 */

#include <stdlib.h>
#include <string.h>
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>

#define ENTRENAMIENTO 961
#define ATRIBUTOS 6

using namespace std;

void readData(string data[ENTRENAMIENTO][ATRIBUTOS]){

	char* newPart = (char*)calloc(20,sizeof(char));
	string datosIn;
	int i = 0, j = 0, k = 0;
	char* nombreArchivo = "mammographic_masses.data";
	int lineas = 0;
	ifstream inData(nombreArchivo,ifstream::in);
	if(!inData){
		cout << "error abriendo archivo: \"" << nombreArchivo << "\". Finalizara la ejecucion." << endl;
		exit(0);
		return;
	}

	while (getline(inData,datosIn)){
		if(lineas == ENTRENAMIENTO){
			break;
		}
		lineas++;
		k = 0;
		strcpy(newPart, datosIn.c_str());
		data[i][0] = strtok(newPart,", ");
		for(j = 1; j < ATRIBUTOS; j++){
                    data[i][j] = strtok(NULL,", ");
		}
		i++;
	}
}

inline int atoiS(const std::string& s){
	std::istringstream i(s);
	int x;
	if (!(i >> x))
	exit(0);
	return x;
}

/* Prototipo de la función de comparar */
int comparar(const void *arg1, const void *arg2){
 if(*(int *)arg1 < *(int *)arg2) return -1;
   else if(*(int *)arg1 > *(int *)arg2) return 1;
   else return 0;
}

int mediana(int* atributos, int tam){
	int mediana;
	qsort(atributos,tam,sizeof(int),comparar);
	if(tam % 2 == 0){
		mediana = (atributos[tam/2] + atributos[(tam/2)+1])/2;
	}
	else{
		mediana = atributos[tam/2];
	}
}
/*
 * 
 */
int main(int argc, char** argv) {
	string data[ENTRENAMIENTO][ATRIBUTOS];
	int birads[ENTRENAMIENTO-2];
	int edad[ENTRENAMIENTO-5];
	int forma[ENTRENAMIENTO-31];
	int margen[ENTRENAMIENTO-48];
	int densidad[ENTRENAMIENTO-76];
	int medianas[5];
	int indiceBirads = 0;
	int indiceEdad = 0;
	int indiceForma = 0;
	int indiceMargen = 0;
	int indiceDensidad = 0;
	readData(data);
 	for(int i = 0; i < ENTRENAMIENTO; i++){
		if(!(data[i][0].compare("?"))){
			birads[indiceBirads++] = atoiS(data[i][0]);
		}
		if(!(data[i][1].compare("?"))){
			edad[indiceEdad++] = atoiS(data[i][1]);
		}
		if(!(data[i][2].compare("?"))){
			forma[indiceForma++] = atoiS(data[i][2]);
		}
		if(!(data[i][3].compare("?"))){
			margen[indiceMargen++] = atoiS(data[i][3]);
		}
		if(!(data[i][4].compare("?"))){
			densidad[indiceDensidad++] = atoiS(data[i][4]);
		}
	}
	
	medianas[0] = mediana(birads,ENTRENAMIENTO-2);
	medianas[1] = mediana(edad,ENTRENAMIENTO-5);
	medianas[2] = mediana(forma,ENTRENAMIENTO-31);
	medianas[3] = mediana(margen,ENTRENAMIENTO-48);
	medianas[4] = mediana(densidad,ENTRENAMIENTO-76);
	cout << "Medianas: " << medianas[0] << ", " << medianas[1] << ", " << medianas[2] << ", " << medianas[3] << ", " << medianas[4] << endl;

 	for(int i = 0; i < ENTRENAMIENTO; i++){
		if(atoiS(data[i][ATRIBUTOS-1]) == 0){
			cout << "-1 ";
		}
		else{
			cout << "+1 ";
		}
		for(int j = 0; j < ATRIBUTOS - 1; j++){
			if(!(data[i][j].compare("?"))){
				cout << (j+1) << ":" << medianas[j] << " ";
			}
			else{
				cout << (j+1) << ":" << data[i][j] << " ";
			}
		}
		cout << endl;
	}
	return (EXIT_SUCCESS);
}

